home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD Concept 6
/
CD Concept 06.iso
/
mac
/
UTILITAIRE
/
RLaB
/
toolbox
/
expm.r
< prev
next >
Wrap
Text File
|
1994-02-21
|
1KB
|
66 lines
//-------------------------------------------------------------------//
// Syntax: expm ( A )
// Description:
// The expm function computes the matrix exponential, or exp (A),
// where A is a square matrix.
// Reference: "Matrix Computations" Gene Golub, and Charles Van
// Loan. Section 11.3.
//-------------------------------------------------------------------//
expm = function ( a_ )
{
local (X, a, c, cX, d, k, N, n, q, j);
if (a_.nr != a_.nc) { error ("expm: A must be square"); }
//
// Scale A if neccesary, such that the infinity-norm of A divided
// by some power of 2 is less than 1/2.
//
j = norm(a_, "i");
if (j > 0)
{
j = max ([0, fix (log (j)/log (2))+2]);
}
a = a_/2^j;
n = a.nr;
//
// k = 1
//
c = 1/2;
X = a;
d = eye (n, n) - c*a;
N = eye (n, n) + c*a;
q = 6;
for (k in 2:q)
{
c = c*(q - k + 1)/(k*(2*q - k + 1));
X = a*X;
cX = c*X;
N = N + cX;
d = d + (-1)^k*cX;
}
//
// Solve d*F = N for F, overwrite N for efficiency
//
N = d\N;
for (k in 1:j)
{
N = N*N;
}
return N;
};